/*   Valhalla MailChecker -- Simple IMAP Mail Checker
*    Copyright (C) 2010-2011  Guillaume Florimond (gflorimond at gmail dot com)
*
*    This program is free software: you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation, either version 3 of the License, or
*    any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package fr.valhalla.mailcheck;

import fr.valhalla.mailcheck.utils.EncryptedProperties;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

/**
 *
 * @author guillaume
 */
public class Account {

    private EncryptedProperties props;
    private String masterpassword;

    public int id;
    public String accountName;
    public String login;
    public String password;
    public String protocol;
    public String host;
    public String folder;
    public int port;
    public int sleep;
    public boolean ssl;
    public String sound;
    public boolean notifications;

    public Account(String masterpassword) {
        this.masterpassword = masterpassword;
        init();
    }

    public Account(String accountName, String masterpassword) {
        this.accountName = accountName;
        this.masterpassword = masterpassword;
        init();
        login = props.getProperty("login-" + accountName);
        password = props.getProperty("password-" + accountName);
        protocol = props.getProperty("protocol-" + accountName);
        host = props.getProperty("host-" + accountName);
        folder = props.getProperty("folder-" + accountName);
        port = new Integer(props.getProperty("port-" + accountName));
        sleep = new Integer(props.getProperty("sleep-" + accountName));
        ssl = new Boolean(props.getProperty("ssl-" + accountName));
        sound = props.getProperty("sound-" + accountName);
        notifications = new Boolean(props.getProperty("notifications-" + accountName));
    }

    /**
     * Méthode utilisée par tous les constructeurs
     */
    public void init() {
        try {
            props = new EncryptedProperties(masterpassword);
        } catch(Exception e) { e.printStackTrace(); }
        // On essaie de charger les properties
        try {
            FileInputStream in = new FileInputStream("fr.valhalla.mailcheck.accounts.properties");
            props.load(in);
            in.close();
        }
        catch(FileNotFoundException e) {
            // Le fichier n'existe pas : on le crée
            try {
                props.store(new FileOutputStream(new File("fr.valhalla.mailcheck.accounts.properties")), null);
            }
            catch(Exception e2) { e2.printStackTrace(); }
        }
        catch(IOException e) { e.printStackTrace(); }
    }

    /**
     * Créer un nouveau compte
     * @param accountName
     */
    public void addAccount(String accountName, String login, String password, String protocol, String host, String folder, int port, int sleep, boolean ssl, String sound, boolean notifications) {
        if(props.getProperty("count") == null) {
            id = 1;
        }
        else {
            id = new Integer( props.getProperty("count") ) + 1;
        }
        props.setProperty("count", new Integer(id).toString());
        props.setProperty("id-" + accountName, new Integer(id).toString());
        props.setProperty("account-" + accountName, accountName);
        props.setProperty("login-" + accountName, login);
        props.setProperty("password-" + accountName, password);
        props.setProperty("protocol-" + accountName, protocol);
        props.setProperty("host-" + accountName, host);
        props.setProperty("folder-" + accountName, folder);
        props.setProperty("port-" + accountName, new Integer(port).toString());
        props.setProperty("sleep-" + accountName, new Integer(sleep).toString());
        props.setProperty("ssl-" + accountName, new Boolean(ssl).toString());
        props.setProperty("sound-" + accountName, sound);
        props.setProperty("notifications-" + accountName, new Boolean(notifications).toString());
        saveAccount();
    }

    public void updateAccount(String accountName, String login, String password, String protocol, String host, String folder, int port, int sleep, boolean ssl, String sound, boolean notifications) {
        props.setProperty("id-" + accountName, new Integer(id).toString());
        props.setProperty("account-" + accountName, accountName);
        props.setProperty("login-" + accountName, login);
        props.setProperty("password-" + accountName, password);
        props.setProperty("protocol-" + accountName, protocol);
        props.setProperty("host-" + accountName, host);
        props.setProperty("folder-" + accountName, folder);
        props.setProperty("port-" + accountName, new Integer(port).toString());
        props.setProperty("sleep-" + accountName, new Integer(sleep).toString());
        props.setProperty("ssl-" + accountName, new Boolean(ssl).toString());
        props.setProperty("sound-" + accountName, sound);
        props.setProperty("notifications-" + accountName, new Boolean(notifications).toString());
        saveAccount();
    }

    public void deleteAccount() {
        id = new Integer( props.getProperty("count") ) - 1;
        props.setProperty("count", new Integer(id).toString());
        props.remove("id-" + accountName);
        props.remove("account-" + accountName);
        props.remove("login-" + accountName);
        props.remove("password-" + accountName);
        props.remove("protocol-" + accountName);
        props.remove("host-" + accountName);
        props.remove("folder-" + accountName);
        props.remove("port-" + accountName);
        props.remove("sleep-" + accountName);
        props.remove("ssl-" + accountName);
        props.remove("sound-" + accountName);
        props.remove("notifications-" + accountName);
        saveAccount();
    }

    public void saveAccount() {
        try {
            props.store(new FileOutputStream("fr.valhalla.mailcheck.accounts.properties"),"Accounts configuration");
        } catch(Exception e) { e.printStackTrace(); }
    }

    public int reCountAccounts() {
        Iterator i = props.keySet().iterator();
        int index = 0;
        while(i.hasNext()) {
            String key = (String) i.next();
            //String value = props.getProperty(key);
            if(key.substring(0, 7) == null ? "account" == null : key.substring(0, 7).equals("account"))
                index++;
        }
        props.setProperty("count", new Integer(index).toString());
        System.out.println("Recount: " + index);
        return index;
    }

    public String getAccountName() {
        return accountName;
    }

    public String getHost() {
        return host;
    }

    public String getLogin() {
        return login;
    }

    public String getPassword() {
        return password;
    }

    public String getFolder() {
        return folder;
    }

    public int getPort() {
        return port;
    }

    public String getProtocol() {
        return protocol;
    }

    public int getSleep() {
        return sleep;
    }

    public boolean isSSL() {
        return ssl;
    }

    public String getSound() {
        return sound;
    }

    public boolean hasNotifications() {
        return notifications;
    }


    public void setHost(String host) {
        this.host = host;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setFolder(String folder) {
        this.folder = folder;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public void setProtocol(String protocol) {
        this.protocol = protocol;
    }

    public void setSleep(int sleep) {
        this.sleep = sleep;
    }

    public void setSsl(boolean ssl) {
        this.ssl = ssl;
    }

    public void setSound(String sound) {
        this.sound = sound;
    }

    public void setNotifications(boolean notifications) {
        this.notifications = notifications;
    }


    

}
